Android 存储空间的最佳实践 (上)
分区存储
https://developer.android.google.cn/training/data-storage#scoped-storage
处理媒体文件
使用 query() API 查询媒体集合。您可以通过调整 projection、 selection、 selectionArgs 与 sortOrder 参数来对媒体文件进行过滤和排序。
query() https://developer.android.google.cn/reference/android/content/ContentResolver#query(android.net.Uri,%20java.lang.String%5B%5D,%20java.lang.String,%20java.lang.String%5B%5D,%20java.lang.String,%20android.os.CancellationSignal) 查询媒体集合 https://developer.android.google.cn/training/data-storage/shared/media#query-collection
使用 "请求应用权限" 一文中描述的最佳实践来请求 READ_EXTERNAL_STORAGE 权限。
使用 MediaColumns.DATA 中的值来检索媒体文件,其中包含了磁盘中媒体文件的绝对文件系统路径。
请求应用权限 https://developer.android.google.cn/training/permissions/requesting READ_EXTERNAL_STORAGE https://developer.android.google.cn/reference/android/Manifest.permission#READ_EXTERNAL_STORAGE MediaColumns.DATA https://developer.android.google.cn/reference/kotlin/android/provider/MediaStore.MediaColumns#data
如果您的应用使用了分区存储,可以遵循媒体存储指南中的 "照片中的位置信息" 部分进行操作。
注意: 就算您选择停用分区存储,在使用 MediaStore API 访问图像并读取未修改的位置信息时,您也需要请求 ACCESS_MEDIA_LOCATION 权限。
照片中的位置信息 https://developer.android.google.cn/training/data-storage/shared/media#location-info-photos MediaStore https://developer.android.google.cn/reference/android/provider/MediaStore ACCESS_MEDIA_LOCATION https://developer.android.google.cn/reference/android/Manifest.permission#ACCESS_MEDIA_LOCATION
您需要根据运行应用的 Android 版本来整合逻辑。
使用以下方法:
使用 MediaStore.createWriteRequest() 或 MediaStore.createTrashRequest() 为应用的写入或删除请求创建待定 intent,然后通过调用该 intent 提示用户授予修改一组文件的权限。
评估用户的响应:
如果获得了权限,执行修改或删除操作;
如果未能获得权限,向用户解释为什么您的应用需要此权限。
MediaStore.createWriteRequest() https://developer.android.google.cn/reference/android/provider/MediaStore#createWriteRequest(android.content.ContentResolver,%20java.util.Collection%3Candroid.net.Uri%3E) MediaStore.createTrashRequest() https://developer.android.google.cn/reference/android/provider/MediaStore#createTrashRequest(android.content.ContentResolver,%20java.util.Collection%3Candroid.net.Uri%3E,%20boolean) 执行批量操作 https://developer.android.google.cn/preview/privacy/storage#media-batch-operations
在 Android 10 上运行
请停用分区存储 https://developer.android.google.cn/training/data-storage/use-cases#opt-out-scoped-storage
在 Android 9 及更低版本上运行
使用以下方法:
使用 "请求应用权限" 一文中描述的最佳实践来请求 WRITE_EXTERNAL_STORAGE 权限。
使用 MediaStore API 来修改和删除媒体文件。
WRITE_EXTERNAL_STORAGE https://developer.android.google.cn/reference/android/Manifest.permission#WRITE_EXTERNAL_STORAGE
导入已存在的单个图片
提供您自己的用户界面
使用以下方法:
使用 "请求应用权限" 一文中描述的最佳实践来请求 READ_EXTERNAL_STORAGE 权限。
使用 query() API 查询媒体集合。
将结果显示到您的 UI 上。
使用系统选择器
ACTION_GET_CONTENT
https://developer.android.google.cn/reference/android/content/Intent#ACTION_GET_CONTENT
setType()
https://developer.android.google.cn/reference/android/content/Intent#setType(java.lang.String)
EXTRA_MIME_TYPES
https://developer.android.google.cn/reference/android/content/Intent#EXTRA_MIME_TYPES
拍摄单张图片
ACTION_IMAGE_CAPTURE https://developer.android.google.cn/reference/android/provider/MediaStore#ACTION_IMAGE_CAPTURE MediaStore.Images https://developer.android.google.cn/reference/android/provider/MediaStore.Images
与其他应用共享媒体文件
insert()
https://developer.android.google.cn/reference/android/content/ContentResolver#insert(android.net.Uri,%20android.content.ContentValues)
添加项目
https://developer.android.google.cn/training/data-storage/shared/media#add-item
与特定应用共享媒体文件
设置文件分享
https://developer.android.google.cn/training/secure-file-sharing/setup-sharing
从代码或依赖库中使用直接文件路径访问文件
在 Android 11 上运行
使用以下方法:
使用 "请求应用权限" 一文中描述的最佳实践来请求 READ_EXTERNAL_STORAGE 权限。
使用直接文件路径访问文件。
使用原始路径访问文件 https://developer.android.google.cn/preview/privacy/storage#media-files-raw-paths
在 Android 10 上运行
使用 "请求应用权限" 一文中描述的最佳实践来请求 WRITE_EXTERNAL_STORAGE 权限。 使用直接文件路径访问文件。
数据和文件存储概览
https://developer.android.google.cn/training/data-storage
Android 存储用例和最佳做法 - Android 官方中文文档
https://developer.android.google.cn/training/data-storage/use-cases?hl=zh-CN
推荐阅读